package models;

import java.util.Random;

import models.msgs.*;
import models.msgs.Call;
import models.msgs.Number;
import play.Logger;
import play.mvc.*;
import play.libs.*;
import play.libs.F.*;
import akka.actor.*;
import scala.concurrent.duration.*;
import akka.actor.*;

import java.util.Random;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import static java.util.concurrent.TimeUnit.*;

public class Bot extends UntypedActor{
   
    public String name;
    public int numer;
    public final ActorRef       table;
    static WebSocket.Out<JsonNode> in;
    static WebSocket.In<JsonNode> out;
    boolean czy_wymiana = true;
    boolean czy_pierwszy = true;
    int stawka;
    int kasa;
    int my_pula;
   
    public Bot(String _name, ActorRef _table, int _numer) {
       
        table = _table;
        name = _name;
        numer = _numer;
       
        // Create a Fake socket out for the robot that log events to the console.
        WebSocket.Out<JsonNode> out = new WebSocket.Out<JsonNode>() {
           
            public void write(JsonNode frame) {
                Logger.of("Bot(y) zostały załadowane").info(Json.stringify(frame));
            }
           
            public void close() {}
           
        };
       
        WebSocket.In<JsonNode> in = new WebSocket.In<JsonNode>() {
           
           public void write(JsonNode frame) {
                Logger.of("Bot(y) zostały załadowane").info(Json.stringify(frame));
            }
           
            public void close() {}
           
        };
                             
    }
   

    @Override
    public void onReceive(Object msg) throws Exception
    {
            if(msg instanceof Change)
            {    
                table.tell(new Number(numer,name,wymien()), getSelf() );
            }
            else if(msg instanceof Number)
            {       
                table.tell(new Win(numer,name), getSelf());
            }
            else if(msg instanceof Quit)
            {     
	            table.tell(new Quit(name,numer), getSelf());
            }
            else if(msg instanceof Init)
            {     
            	licytacja();
            }
            else if(msg instanceof NewRound)
            {     
            	zerowanie();
            	table.tell(new Check(numer,name), getSelf() ); 
            }
    }
    public void zerowanie(){
    	czy_wymiana = true;
        czy_pierwszy = true;
    }

    public void licytacja(){
    	int uklad = Table.game.sys.syst(Table.game.creator.hand[numer].cards);
    	kasa=Table.game.coin[numer];
    	stawka=Table.getStawka();
    	my_pula=Table.getMyPula(numer);
    	if (kasa<10)
    		table.tell(new Allin(numer,name), getSelf());
    	else{
	    	if (uklad == 1){
	    		table.tell(new Allin(numer,name), getSelf());
	    		czy_wymiana = false;
	    	}
	    	else	
	    	if ((uklad == 2) || (uklad == 3) || (uklad == 4) || (uklad == 5)){    		
	    		if(czy_pierwszy){
	    			//Raise
	    			//weź ile leży na stole odejmij to od swojej kasy i podbij o połowe z tego 
	    			if((stawka-my_pula)<kasa/4){
	    				table.tell(new Raise(numer,name, kasa/4), getSelf()); 
	    			}
	    			else
	    				if((stawka-my_pula)>=kasa)
	    					table.tell(new Fold(numer,name), getSelf());
	    				else
	    					table.tell(new Call(numer,name), getSelf());  	
	    			czy_pierwszy = false;
	    			czy_wymiana = false;
	    		}
	    		else{
	    			//Call jeżeli nie musisz dorzucić więcej niż 1/2 swojej kasy inaczej fold
	    			if((stawka-my_pula)<kasa)
	    				table.tell(new Call(numer,name), getSelf() ); 
	    			else
	    				if((stawka-my_pula)==kasa)
		    				table.tell(new Allin(numer,name), getSelf() );
	    				else
	    				table.tell(new Fold(numer,name), getSelf());        			
	    		}
	    	}
	    	else
	    	if((uklad == 6) || (uklad == 7)){
	    		if(czy_pierwszy){
	    			//Raise
	    			// weź ile leży na stole odejmij to do swojej kasy i podbij o 1/4 z tego
	    			if((stawka-my_pula)<kasa/16){
	    				table.tell(new Raise(numer,name, kasa/16), getSelf()); 
	    			}
	    			else
	    				if((stawka-my_pula)>=kasa)
	    					table.tell(new Fold(numer,name), getSelf());
	    				else
	    					table.tell(new Call(numer,name), getSelf());  
	    			czy_pierwszy = false;
	    			czy_wymiana = false;
	    		}
	    		else{
	    			//Call jeżeli nie musisz dorzucić 1/4 swojej kasy inaczej fold
	    			if((stawka-my_pula)<kasa)
	    				table.tell(new Call(numer,name), getSelf() ); 
	    			else
	    				if((stawka-my_pula)==kasa)
		    				table.tell(new Allin(numer,name), getSelf() );
	    				else
	    					table.tell(new Fold(numer,name), getSelf()); 
	    		}
	    	}
	    	else
	    	if(uklad == 8){
	    		if(czy_pierwszy){
	    			//Raise
	    			// weź ile leży na stole odejmij to do swojej kasy i podbij o 1/16 z tego
	    			if((stawka-my_pula)<kasa/32){
	    				table.tell(new Raise(numer,name, kasa/32), getSelf()); 
	    			}
	    			else
	    				if((stawka-my_pula)>=kasa)
	    					table.tell(new Fold(numer,name), getSelf());
	    				else
	    					table.tell(new Call(numer,name), getSelf());  
	    			czy_pierwszy = false;
	    			czy_wymiana = true;
	    		}
	    		else{
	    			//Call jeżeli nie musisz dołorzyć więcej niż 1/16 swojej kasy inaczej fold
	    			if((stawka-my_pula)<kasa)
	    				table.tell(new Call(numer,name), getSelf() ); 
	    			else
	    				if((stawka-my_pula)==kasa)
		    				table.tell(new Allin(numer,name), getSelf() );
	    				else
	    					table.tell(new Fold(numer,name), getSelf());
	    		}
	    	}
	    	else	
	    	if (uklad == 9){
	    		if(czy_pierwszy){
	    			table.tell(new Call(numer,name), getSelf() );
	    			czy_pierwszy=false;
	    		}
	    		else
	    			if((stawka-my_pula)==kasa)
	    				table.tell(new Allin(numer,name), getSelf() );
	    			else
	    				table.tell(new Fold(numer,name), getSelf());
	    	}
	    	table.tell(new Check(numer,name), getSelf());
    	}
    }
    
    public String wymien(){
    	Random gen = new Random();
    	String wymiana=" 0";
 
    	int rand = gen.nextInt(4);
    	if(czy_wymiana){
	    	if(rand == 1)
	    		wymiana= " 1";
	    	if(rand == 2)
	    		wymiana= " 1,2";
	    	if(rand == 3)
	    		wymiana= " 1,2,3";
	    	if(rand == 4)
	    		wymiana= " 1,2,3,4";
    	}
    return wymiana;
    }
    
}


